package com.own.component.util.excel.util.read.method;

import com.own.component.util.excel.util.read.base.BaseExcelReadConfig;
import com.own.component.util.excel.util.read.em.DateFormatter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.DateUtil;

import java.text.SimpleDateFormat;

/**
 * * 获取单元格的批注信息
 *
 * @author chenxueli
 * @date 2022-10-08 16:59:00
 */
@Slf4j
public class CellMethod {

    /**
     * 获取单元格的内容
     *
     * @param cell 单元格
     * @return 值
     */
    public static <T, CONFIG extends BaseExcelReadConfig<T>> String getValueReal(Cell cell, CONFIG config) {
        if (cell == null) {
            return "";
        }
        // 数字
        if (cell.getCellType() == CellType.NUMERIC) {
            // 处理日期格式、时间格式
            if (DateUtil.isCellDateFormatted(cell) || DateUtil.isCellInternalDateFormatted(cell)) {
                if (config != null && config.isUnitDateFormat()) {
                    return new SimpleDateFormat(config.getResolveDateTime()).format(cell.getDateCellValue());
                }
                return DateFormatter.formatter(cell.getCellStyle().getDataFormat(), cell.getDateCellValue());
            }
            // 处理数值格式
            if (cell.getCellStyle().getDataFormat() == 0) {
                return new DataFormatter().formatCellValue(cell);
            }
        }
        if (cell.getCellType() == CellType.STRING) {
            return cell.getStringCellValue();
        }
        if (cell.getCellType() == CellType.BOOLEAN) {
            return String.valueOf(cell.getBooleanCellValue());
        }
        if (cell.getCellType() == CellType.FORMULA) {
            return String.valueOf(cell.getCellFormula());
        }
        return cell.toString();
    }

    /**
     * 获取单元格的内容
     *
     * @param cell 单元格
     * @return 值
     */
    public static String getValue(Cell cell) {
        return getValueReal(cell, null);
    }

    /**
     * 获取格式化后的单元格的内容
     *
     * @param cell     单元格
     * @param config   配置
     * @param <T>      泛型
     * @param <CONFIG> 配置泛型
     * @return 值
     */
    public static <T, CONFIG extends BaseExcelReadConfig<T>> String getValue(Cell cell, CONFIG config) {
        var value = getValueReal(cell, config);
        if (config == null || config.getResolveValue() == null) {
            return value;
        }
        return config.getResolveValue().apply(value);
    }

    /**
     * 获取单元格的批注信息
     *
     * @param cell 单元格
     * @return 批注信息
     */
    public static String getComment(Cell cell) {
        if (cell == null || cell.getCellComment() == null) {
            return "";
        }
        // 去除作者信息
        var author = cell.getCellComment().getAuthor();
        var fieldKey = cell.getCellComment().getString().getString();
        if (StringUtils.isNotBlank(author) && StringUtils.isNotBlank(fieldKey) && fieldKey.startsWith(author)) {
            fieldKey = fieldKey.substring(author.length());
        }
        // 去除回车信息
        var len = ":\n";
        if (fieldKey.startsWith(len)) {
            fieldKey = fieldKey.substring(len.length());
        }
        return StringUtils.isNotBlank(fieldKey) ? fieldKey : "";
    }

    /**
     * 获取格式化后的单元格的批注信息
     *
     * @param cell     单元格
     * @param config   配置
     * @param <T>      泛型
     * @param <CONFIG> 配置泛型
     * @return 批注信息
     */
    public static <T, CONFIG extends BaseExcelReadConfig<T>> String getComment(Cell cell, CONFIG config) {
        var value = getComment(cell);
        if (config == null || config.getResolveValue() == null) {
            return value;
        }
        return config.getResolveValue().apply(value);
    }

}
